REPNE Повторять пока не равно

Флаги не меняются.

Команда:

REPNE  КОС (команда обработки строк)

Логика

while CX <> 0     	; для КОС MOVS, LODS или STOS
                выполнить КОС
                CX = CX - 1
            _______________________________________________
while CX <> 0         	; для КОС CMPS или SCAS
                CX = CX - 1
                if  ZF  <> 0 то заканчиваем цикл 	; это единственное
                                                 	; отличие  от REP

REPNE - это префикс, который может быть употреблен перед любой КОС (CMPS, LODS, MOVS, SCAS и STOS). Префикс REPNE заставляет выполняться следующую за ним КОС в повторном режиме до тех пор, пока CX не станет равным 0; CX уменьшается на 1 после каждого выполнения КОС. (Для КОС CMPS и SCAS циклический повтор прерывается также, если флаг нулевого результата ZF оказывается установленным после очередного выполнения КОС. Ср. с префиксом REP, при котором циклический повтор прерывается, если ZF оказывается, наоборот, сброшенным.)

Операнды Такт байты (слова)ОбращенияБайтыПример
нет операндов2 - 1REPNE SCASB

Примечания:
Если CX с самого начала равно 0, то КОС не выполняется ни разу. Проверка о равенстве CX нулю проводится перед выполнением КОС. Проверка о равенстве ZF единице проводится только для команд CMPS и SCAS, причем лишь после очередного выполнения КОС.
Префиксы REPNE и REPNZ являются синонимами одного и того же префикса.
У Вас нет необходимости инициализировать ZF перед использованием повторяющихся КОС.
Повторяющаяся КОС, которая была прервана между повторами, будет корректно возобновлена после возврата из прерывания. Однако, если перед КОС находятся также другие префиксы (например, LOCK) в добавление к REPNE, то все префиксы, кроме того, который непосредственно предшествует команде, будут потеряны. Поэтому, если Вам нужно использовать команду с несколькими префиксами одновременно, то Вам следует запретить прерывания на время выполнения команды (и снова разрешить из после ее выполнения). Обратите Ваше внимание на то, что даже такая мера предосторожности не предохраняет от немаскированных прерываний и что обработка длинных строк может существенно задерживать обработку прерываний.
Следующий пример иллюстрирует поиск первого байта, равного 'A' в стобайтовой строке STRING :

CLD              		;будем двигаться в прямом направлении
MOV   AL,'A'     		;будем сравнивать с 'A'
LEA   DI, STRING 		;засылаем в DI стартовый адрес строки
MOV   CX,100     		;сравнивать будем 100 байтов
REPNE SCASB            	;сравниваем 'A' с очередным байтом
DEC   DI         		;возвращаем указатель DI на 'A'

После окончания выполнения команды REPNE SCASB, CX будет равен нулю, если байтовое значение 'A' не было обнаружено в строке STRING, и CX будет больше 0, в противном случае.

Hosted by uCoz